/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bocciawii
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * teclado is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * teclado is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _BARRA_H_
#define _BARRA_H_
#include "elemento.h"

/**
 * @brief Implementación básica de un widget tipo 'barra de progreso'
 *
 * Esta clase ofrece funcionalidad de barra de progreso. Hereda de Elemento.
 *
 * Puede estar acompañada por una imagen.
 *
 * Actualmente, la barra sólo tiene orientación de izquierda (0%) a derecha (100%)
 * y una altura de 20 píxeles (hardcoded). 
 *
 * Ofrece la posibilidad de cambiar colores, tanto de origen como de salida, 
 * por lo que se pueden crear gradientes para determinar una intensidad o una fuerza.
 */
class Barra:public Elemento
{
public:

	/**
	 * @brief Constructor de nuestra clase, inicializa variables
	 *
	 * Llama al constructor de la superclase con <code>id</code> y establece los 
	 * valores por defecto para el resto de variables miembro.
	 * @param id Identificador único del container que lo contenga. Sugerido que sea
	 * el único del super-contenedor
	 *
	 */
	Barra(std::string id);
	~Barra();

	/**
	 * @brief Setter para el porcentaje
	 *
	 * Pone el porcentaje de la barra al valor deseado. Ha de recibir porcentajes,
	 * ya que no se le da máximo ni mínimo, y por lo tanto, la clase no los calcula.
	 * @param percent % a rellenar de la barra.
	 */
	void SetPercent(int percent);

	/**
	 * @brief Setter para la anchura de la barra
	 *
	 * Asigna un ancho absoluto en píxeles a la barra. 
	 * Cualquier cambio en esta variable requerirá un Pack() para poder volver a mostrarlo
	 * correctamente
	 * @param percent tamaño en píxeles
	 */
	void SetSize(int size);

	/**
	 * @brief Setter para el color origen de la barra
	 *
	 * Asigna un color origen a la barra
	 * @param color float[3] con R, G y B
	 */
	void SetBGColor(float* color);	
	/**
	 * @brief Setter para el color destino de la barra
	 *
	 * Asigna un color destino a la barra
	 * @param color float[3] con R, G y B
	 */
	void SetFGColor(float* color);

	/**
	 * @brief Getter para las coordenadas absolutas del widget
	 *
	 * Devuelve la posición del widget en pantalla en coordenadas absolutas de ventana.
	 * @return int[4] con x_inicio, x_final, y_inicio, y_final
	 */
	int* GetScreenCoords();

	/**
	 * @brief Getter para el espacio necesario del widget
	 *
	 * Devuevle el espacio necesario en píxeles para el widget. Se utiliza en los 
	 * procedimientos Pack() de los contenedores.
	 * @return int[2] con ancho, alto
	 */
	int* GetNeededSpace();

	/**
	 * @brief Transformar espacio necesario en coordenadas absolutas de pantalla
	 *
	 * A partir del espacio necesario del widget, y del centro donde deseemos que se
	 * encuentre el widget, se calcularán las coordenadas absolutas para la barra y la
	 * imagen, si tuviera
	 * @param centro_x la coordenada x del centro del widget
	 * @param centro_y la coordenada y del centro del widget
	 */
	void Pack(int centro_x, int centro_y);


	/**
	 * @brief Dibujado del widget
	 *
	 * Usa las coordenadas calculadas por el Pack(), esto es, si no se hace Pack()
	 * antes del dibujado el resultado es muy inesperado, para dibujar el widget en la 
	 * pantalla, tanto su imagen (si tuviera) como la barra con el porcentaje apropiado.
	 * Los colores origen y destino son utilizados, pero con la particularidad de que
	 * el color destino es tan sólo el porcentaje asignado a la barra del asignado 
	 * con SetFGColor()
	 */
	void Dibujar();
	
protected:
	/// La posición de la barra
	bar_alloc _posBar;
	/// El porcentaje de la barra
	int _percent;

	/// float[3] con el color destino de la barra
	float* _fgColor;
	/// float[3] con el color origen de la barra
	float* _bgColor;

	/// El centro del widget
	int _centro_x;
	/// El centro del widget
	int _centro_y;

private:

};

#endif // _BARRA_H_
